除了使用 DSL 的方式和資料庫進行互動之外,我們還可以透過更加物件導向的方式,來和資料庫進行溝通。
以下我們介紹使用 DAO 的方式,來和資料庫進行溝通。
DAO(Data Access Object),類似於其他資料庫框架所說的 ORM(Object Relational Mapping),是用物件導向的方式,來和資料庫進行互動。
由於 DAO 使用的方式,是多數開發者已經很熟悉的物件操作。和需要思考背後 SQL 語法的 DSL 或者 Query Builder 比較,如果開發者對 Query 語法沒有這麼熟悉的話,使用 DAO 進行資料庫存取,會更加的直觀一些。
下面我們來介紹怎麼使用 DAO 來進行資料庫的 CRUD 操作。
首先,除了建立資料表以外,我們也要建立和表互動的類別。
我們在下面定義 User
類別,來做為我們存取 Users
資料表的 DAO
class User(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<User>(Users)
var cityId by Users.cityId
var name by Users.name
}
建立好 DAO 類別之後,我們就可以透過物件的方式來存取資料庫。
比方說,我們可以建立新資料
transaction {
SchemaUtils.create(Users)
User.new {
cityId = 1
name = "Alice"
}
User.new {
cityId = 2
name = "Bob"
}
}
和 DSL 時一樣,我們建立好資料之後,如果沒有讀取的話,無法知道我們的資料是不是成功建立了。
我們一樣可以透過 DAO 物件來讀取資料
User
.all()
.forEach {
println("name: ${it.name}")
}
運行程式之後,我們就可以看到
name: Alice
name: Bob
修改資料的方式也一樣可以透過 DAO 的做法,以物件的方式,我們只要修改 DAO 物件的 attribute,就可以修改資料
SchemaUtils.create(Users)
User.new {
cityId = 1
name = "Alice"
}
val user = User.new {
cityId = 2
name = "Bob"
}
user.name = "Carol"
User
.all()
.forEach{
println("name: ${it.name}")
}
這樣可以看到資料是
name: Alice
name: Carol
如果我們沒有儲存寫入資料一開始的 DAO 物件,我們可以透過 id
取出我們想要的資料
SchemaUtils.create(Users)
User.new {
cityId = 1
name = "Alice"
}
User.new {
cityId = 2
name = "Bob"
}
val user = User[1]
user.name = "Carol"
User
.all()
.forEach{
println("name: ${it.name}")
}
這樣輸出就變成了
name: Carol
name: Bob
刪除的方式可以透過 delete()
函數進行操作。
SchemaUtils.create(Users)
User.new {
cityId = 1
name = "Alice"
}
User.new {
cityId = 2
name = "Bob"
}
User[1].delete()
User
.all()
.forEach{
println("name: ${it.name}")
}
運作這段程式之後,我們就會看到 Alice
的資料消失了
name: Bob
介紹完 DAO 的 CRUD 之後,我們來介紹一下上面程式內用到的 kotlin 語法。
companion object
根據 kotlin 官方文件的 companion object 說明
An object declaration inside a class can be marked with the
companion
keyword
DAO 的做法裏面,透過宣告
companion object : IntEntityClass<User>(Users)
我們可以讓 User
類別能存取 IntEntityClass
內的函數,進而執行 EntityClass
所定義的 new()
、all()
、delete()
等函數。
以上我們簡單的介紹了 kotlin Exposed 透過 DAO 執行 CRUD 的做法,我們下回見!